#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
 union semun			//必须自定义联合
{
    int              val;   
    struct semid_ds *buf;   
    unsigned short  *array;  
    struct seminfo  *__buf;  
};

int main()
{
	//创建key
	key_t key = ftok(".",'s');
	if(-1 == key) 
	{
		printf("ftok 失败:%m\n");
		exit(-1);
	}
	printf("ftok %m\n");


	//创建信号量
	int semid = semget(key,1,IPC_CREAT|0666);
	if(-1 == semid)
	{
		printf("创建信号量 失败:%m\n");
		exit(-1);
	}
	printf("创建信号量 %m\n");


	//初始化信号量
	union semun u;
	u.val = 5;

	semctl(semid,0,IPC_SET,&u);


	//使用信号量
	struct sembuf buf;

	buf.sem_num = 0;
	buf.sem_op = -1;//减1  加上 -1
	buf.sem_flg = 0;//操作方式 默认的

	int n=1;
	while(1)
	{
		printf("讲课%d小时!\n",n++);
		semop(semid,&buf,1);//操作1次
	}

	return 0;
}